/**
 * 用户相关API接口
 */

import request from '../utils/request.js'
import { getCurrentUserId } from '../utils/userAuth.js'

export const userApi = {
  /**
   * 获取当前用户信息
   */
  getCurrentUserInfo() {
    return request.get('/user/profile')
  },

  /**
   * 获取用户个人资料
   */
  getUserProfile() {
    const userId = getCurrentUserId()
    
    // 根据后端UserInfoController实际路径
    const url = `/user/users/findById?id=${userId}`
    // 与旧前端保持一致，关闭默认错误提示，让错误在页面组件的catch中处理
    return request.get(url, {}, { showError: false })
  },

  /**
   * 更新用户个人资料
   * 对接后端 UserInfoController.updateUsersInfo 方法
   * @param {Object} data - 用户数据
   * @param {string} data.nickname - 昵称（必填）
   * @param {string} data.username - 用户名（必填）
   * @param {string} data.phone - 手机号（可选）
   * @param {string} data.email - 邮箱（可选，一般不允许修改）
   */
  updateUserProfile(data) {
    const userId = getCurrentUserId()
    
    // 参数验证
    if (!data || typeof data !== 'object') {
      throw new Error('更新数据不能为空')
    }
    
    if (!data.nickname || !data.nickname.trim()) {
      throw new Error('昵称不能为空')
    }
    
    if (!data.username || !data.username.trim()) {
      throw new Error('用户名不能为空')
    }
    
    // 手机号格式验证（如果提供了手机号）
    if (data.phone && !/^1[3-9]\d{9}$/.test(data.phone)) {
      throw new Error('手机号格式不正确')
    }
    
    // 构建请求数据，严格按照后端 Users 实体字段结构
    const updateData = {
      id: userId, // 后端需要 id 字段来确定更新哪个用户
      nickname: data.nickname.trim(),
      username: data.username.trim()
    }
    
    // 只有当手机号不为空时才添加到更新数据中
    if (data.phone && data.phone.trim()) {
      updateData.phone = data.phone.trim()
    }
    
    // 邮箱字段（如果需要更新）
    if (data.email && data.email.trim()) {
      updateData.email = data.email.trim()
    }
    
    // 根据后端UserInfoController实际路径
    // 对应后端 @PostMapping("/updateUsersInfo") 接口
    // 与旧前端保持一致，关闭默认错误提示
    return request.post('/user/users/updateUsersInfo', updateData, { showError: false })
  },

  /**
   * 更新用户信息（保留原有方法以兼容其他地方的调用）
   * @param {Object} data - 用户数据
   */
  updateUserInfo(data) {
    return this.updateUserProfile(data)
  },

  /**
   * 根据用户名获取用户信息（包含头像）
   * @param {string} username - 用户名
   */
  getUserInfoByUsername(username) {
    return request.get('/user/users/findByUsername', {
      username: username
    })
  },

  /**
   * 批量获取用户信息（根据用户名列表）
   * @param {Array<string>} usernames - 用户名列表
   */
  getUserInfoByUsernames(usernames) {
    return request.post('/user/users/findByUsernames', {
      usernames: usernames
    })
  },

  /**
   * 上传头像
   * @param {string} filePath - 文件路径
   */
  uploadAvatar(filePath) {
    const userId = getCurrentUserId()
    
    return new Promise((resolve, reject) => {
      // 直接访问后端 User-Model 服务
      const uploadUrl = 'http://localhost:6002/users/avatar/upload'
      
      uni.uploadFile({
        url: uploadUrl,
        filePath: filePath,
        name: 'file',
        formData: {
          userId: userId
        },
        header: {
          'Authorization': `Bearer ${uni.getStorageSync('accessToken')}` || ''
        },
        success: (uploadRes) => {
          try {
            const result = JSON.parse(uploadRes.data)
            if (result.success) {
              resolve(result.data)
            } else {
              reject(new Error(result.message || '上传失败'))
            }
          } catch (e) {
            reject(new Error('响应数据解析失败'))
          }
        },
        fail: (error) => {
          reject(new Error('上传失败: ' + error.errMsg))
        }
      })
    })
  },

  /**
   * 修改密码
   * @param {Object} data - 密码数据
   * @param {string} data.oldPassword - 旧密码
   * @param {string} data.newPassword - 新密码
   * @param {string} data.confirmPassword - 确认密码
   */
  changePassword(data) {
    return request.put('/user/change-password', data)
  },

  /**
   * 绑定手机号
   * @param {Object} data - 绑定数据
   * @param {string} data.phone - 手机号
   * @param {string} data.code - 验证码
   */
  bindPhone(data) {
    return request.post('/user/bind-phone', data)
  },

  /**
   * 获取用户统计数据
   */
  getUserStats() {
    return request.get('/user/stats')
  },

  /**
   * 海员认证申请
   * @param {Object} data - 认证数据
   * @param {string} data.certificateNo - 证书编号
   * @param {string} data.certificateType - 证书类型
   * @param {string} data.issueDate - 颁发日期
   * @param {string} data.expiryDate - 到期日期
   * @param {string} data.certificateImages - 证书图片
   */
  seamenAuth(data) {
    return request.post('/user/seamen-auth', data)
  },

  /**
   * 获取海员认证状态
   */
  getSeamenAuthStatus() {
    return request.get('/user/seamen-auth-status')
  },

  /**
   * 获取实名认证状态
   */
  getRealNameAuthStatus() {
    return request.get('/user/real-name-auth-status')
  },

  /**
   * 实名认证申请
   * @param {Object} data - 实名认证数据
   * @param {string} data.realName - 真实姓名
   * @param {string} data.idNumber - 身份证号
   * @param {string} data.idCardFront - 身份证正面
   * @param {string} data.idCardBack - 身份证反面
   */
  realNameAuth(data) {
    return request.post('/user/real-name-auth', data)
  },

  /**
   * 获取用户收获地址列表
   */
  getAddressList() {
    // 后端可能尚未提供该接口，关闭默认错误提示并优雅降级为空数组
    return request.get('/user/addresses', {}, { showError: false })
      .catch((e) => {
        console.warn('地址列表接口不可用或返回错误，使用空列表降级:', e?.message || e)
        return []
      })
  },

  /**
   * 添加收货地址
   * @param {Object} data - 地址数据
   */
  addAddress(data) {
    return request.post('/user/addresses', data)
  },

  /**
   * 更新收货地址
   * @param {string} id - 地址ID
   * @param {Object} data - 地址数据
   */
  updateAddress(id, data) {
    return request.put(`/user/addresses/${id}`, data)
  },

  /**
   * 删除收货地址
   * @param {string} id - 地址ID
   */
  deleteAddress(id) {
    return request.delete(`/user/addresses/${id}`)
  },

  /**
   * 设置默认地址
   * @param {string} id - 地址ID
   */
  setDefaultAddress(id) {
    return request.put(`/user/addresses/${id}/default`)
  }
}

export default userApi